package FilesManagers;
import java.net.*;
import java.nio.charset.Charset;
import java.io.*;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.zip.GZIPInputStream;

public class RemoteUrlManager extends UrlManager{

  private boolean isGzip(String encode){
	  return encode!=null && encode.equals("gzip");
  }
	
  public void copiar(String urlBuscada,String nombreDestino)throws CantOpenFileException
 
  {
	  String encode ="";
	  BufferedReader gzipReader=null;
     try{
          URL url  = new URL(urlBuscada);
          //System.out.println("Abriendo conexion a " + urlBuscada + "...");
          URLConnection urlC = url.openConnection();
          // Copia la web a un archivo, si no esta definido una nombre se usa el remoto
          InputStream is = url.openStream();
          
          // Muestra info de la pagina
          System.out.print("Copiando  (tipo: " +urlC.getContentType());
          setCodificacionCompleja(urlC.getContentType());
          Date date=new Date(urlC.getLastModified());

         System.out.println(", modificado en: " + date.toLocaleString() + " codificacion: "+ urlC.getContentEncoding()+")...");
          //System.out.flush();
          encode = urlC.getContentEncoding();
          /*Hay casos excepcionales donde las html estan codificadas en gzip*/
          if(isGzip(encode)){
        	  gzipReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(is),Charset.forName("Latin1"))); 	  
        	  
          }
          
          FileOutputStream fos=null;
          if (nombreDestino.compareTo("")==0)
          {
              String localFile=null;
              // Obtenemos el nombre de la pagina
              StringTokenizer st=new StringTokenizer(url.getFile(), "/");

              while (st.hasMoreTokens())
                     localFile=st.nextToken();
              fos = new FileOutputStream(localFile);
          }
          else
              fos = new FileOutputStream(nombreDestino);

          int oneChar, count=0;
          if(isGzip(encode)){
        	  while ((oneChar= gzipReader.read()) != -1)
	          {
	             fos.write(oneChar);
	             count++;
	          }
        	  gzipReader.close();
          
          }else{
          
	          while ((oneChar=is.read()) != -1)
	          {
	             fos.write(oneChar);
	             count++;
	          }
          } 
          is.close();
          fos.close();

          System.out.println(count + " byte(s) copiados a disco");
      }
      catch (Exception e)
      {
		 // 	System.err.println(e.toString());
    	  //System.out.println("La url "+urlBuscada+" no es valida");
    	  throw new CantOpenFileException("La url "+urlBuscada+" no es valida");
	  }
      

  }









}